The end session dialog is now using a new style for the warning messages
but this style is not re-used by other dialogs that have messages with a
similar role.
So be consistent, and use same style for all the dialogs that are
showing a warning or an info message, and in particular
- Keyring dialog error messages
- Polkit dialogs error and info messages
- Conflicting dialog warning message
Daniel van Vugt [Fri, 26 Sep 2025 06:36:41 +0000 (14:36 +0800)]
st/theme-context: Warn instead of crashing on unsupported accent colors
For example, Ubuntu's "brown". This is patched into gnome-shell for Ubuntu
but if you forget the patch then it's not worthy of a crash. Just pick a
colour and issue a warning.
notificationDamon: Always send the activation token
In case of FDO notifications, we may receive a notification coming from
non-desktop-applications (e.g. gsd does that), but in any case when
activating an action we should always provide back the activation-token.
So send the startup notification ID in any case, even if the appId is
unset (in fact get_startup_notify_id() uses a nullable parameter for a
reason since GNOME/glib@6210708f).
In wayland this more than enough, while in X11 we could have used the
gnome-shell desktop file as fallback, but that's gone for good now!
Noam Raz [Wed, 24 Sep 2025 08:49:43 +0000 (11:49 +0300)]
overviewControls: Ensure ws thumbnails are expanded before fading in
The current logic in `_updateThumbnailsBox` updates the expand fraction
only after the fade animation completes, rendering the fade-in
transition broken: the thumbnails fade in, but they have a height of 0
until after the animation, when they jarringly "pop" into place. This
abrupt transition is observable when exiting search in the overview with
multiple active workspaces.
Instead, split up the logic a bit to make sure the thumbnails always
appear fully-expanded during the animation: when animating in, the
`expand-fraction` is set _before_ the animation starts, and when
animating out it is set after.
This logic should make all workspace thumbnail state transitions behave
correctly:
- The thumbnails still expand/collapse smoothly when `should-show`
changes because `_updateThumbnailsBox` is called only when that
transition completes.
- Transitions into/out of search just fade the thumbnails because they
are always expanded during the animation.
- https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7668 is avoided
because `expand-fraction` is still set to 1 by `_updateThumbnailsBox`
when revealing the thumbnails.
- The thumbnails still have an `expand-fraction` of 0 when hidden,
carrying over the fixes from 9bf550da8 ("overviewControls: Set
expandFraction for ws thumbnails to 0 when hidden").
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7985 Fixes: c576f82bd ("overviewControls: Make sure thumbnails expandFraction is bound to visibility")
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3888>
gdm/authPrompt: Fix key focus handling on choice list
When a choice list widget is prompted in GDM we call updateSensitivity()
but this does not act on the currently visible authentication widget but
rather on the text entry all the times.
And this causes that when a choice list is shown we always set the key
focus to the (hidden) text entry.
This implies that when the list is finally shown, moving the arrow keys
leads makes the entry context menu to be shown instead of being able to
navigate through the entries.
So, make updateSensitivity use the currently visible authorization
widget instead and use it to control the sensitivity of the choice list
As per previous change we now rely on a GLib version in which GioUnix
DesktopAppInfo implementation provides all the methods, so let's bump
the glib (actually gio) dependency for that.
As we need to be sure that the shell's typelib is rebuilt against newer
Gio, or updating GLib before than the shell would break us.
While introducing latest malcontent in the toolbox, mistakenly wrong
path to install-meson-project.sh was used. Correct this by using the
proper path, after copying the script there.
Moreover, disable building documentation in malcontent subproject
libgsystemservice, so that we don't have to install more dependencies.
Fixes: b7992b80 ("ci: Include latest malcontent in the toolbox")
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3873>
The build-toolbox job only runs for main and stable branches, so
we currently only know whether modifications to the build-toolbox
script actually work once they a merged.
To catch errors up-front, do test builds of the toolbox image
when a merge request modifies the build script.
A race condition can occur where a notification banner gets stuck on screen
and never disappears.
This happens when a new notification needs to be shown while an old one
is in the middle of its hiding animation. The process to show the new
notification calls `remove_all_transitions()`, which forcefully stops
the hiding animation of the old one.
The cleanup logic, which destroys the old banner actor, was located in
the `onComplete` handler of the animation. Since the animation was
interrupted and not completed, this handler was never called, leaving a
"zombie" banner on screen.
To fix this, the call to the cleanup function is moved from the
`onComplete` handler to an `onStopped` handler. This handler is
guaranteed to be called whenever an animation stops, regardless of
whether it finished successfully or was interrupted. This ensures the
banner is always cleaned up correctly.
Carlos Garnacho [Fri, 12 Sep 2025 13:28:09 +0000 (15:28 +0200)]
pointerA11yTimeout: Protect against destroyed PieTimer actor
This trigger an exception if the PieTimer destroys itself before the
ClutterSeat::ptr-a11y-timeout-stopped signal triggers. It's unlikely
to happen now with the fixed arguments, but still makes sense for
correctness.
Carlos Garnacho [Fri, 12 Sep 2025 13:22:31 +0000 (15:22 +0200)]
pointerA11yTimeout: Adapt to API changes in Mutter
https://gitlab.gnome.org/GNOME/mutter/-/commit/76166d61 did sneak
in an API change by removing the ClutterInputDevice arguments from
the ClutterSeat::ptr-a11y-timeout-* signals. Through a series of
astonishing coincidences, we don't use those arguments, so just
remove them. Since the rest of the arguments were shifted, this
fixes broken behavior of the PieTimer.
docs: Replace references to --nested with --devkit
The --devkit option is strongly recommended over the old --nested
nowadays, not least because the latter option no longer exists by
default (as it is tied to the X11 backend).
Remove the section on global shortcuts and workaround for looking glass,
as Devkit supports inhibiting keyboard shortcuts.
ci: Start with a fresh build dir to ensure test dependencies are correct
We want to ensure that meson test just works, without having to redo the
whole dependencies setup phase, so let's just start a new fresh build dir
and run tests there
Ideally meson tests should just work without any pre-requisite build,
instead, we only need a configured build folder to work, but this does
not go as expected in gnome shell at the moment.
Since tests require generated files and compiled typelibs they don't
depend on, so just using `meson test -C build <test-name>` does not work
as expected.
So add test dependencies on test cases. We do not need to have per-test
dependencies right now since most of them share just the same
requirements, and this makes it easier to maintain
Currently the toolbox lacks malcontent >= 0.14.0, because that version
has not been released yet. However, we need it to test the upcoming
parental controls integration, so build it in the toolbox.
Pranav Jerry [Sun, 31 Aug 2025 14:09:02 +0000 (19:39 +0530)]
po/ml: Fix wrong calendar date formats
Closes: https://gitlab.gnome.org/Teams/Translation/ml/-/issues/1 Signed-off-by: Mohammed Sadiq <sadiq@sadiqpk.org>
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3856>
Sebastian Wick [Mon, 8 Sep 2025 11:19:21 +0000 (13:19 +0200)]
brightnessManager: Handle absence of brightness control in _sync
We already call _sync in response to dimming changes, which might happen
no matter if we actually do have control over the brightness.
Let's just embrace _sync getting called in any situation and handle that
state gracefully by simply returning early. If we re-gain control, _sync
will be called again and the updated state becomes active.
An St.Button with toggle-mode ON would not update the toggle state when
invoked via keyboard input.
Fixes: dd694bf1a ("st/button: Use ClutterClickGesture instead of own button-press tracking")
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3865>
Jonas Ådahl [Fri, 5 Sep 2025 13:53:52 +0000 (15:53 +0200)]
popupMenu: Queue relayout on popup menu parent when opening
The position of the menu depends on the position of the "source actor",
but the source actor is not a parent of the menu, but typically a
sibling.
Since we depend on the source actor position for placing the popup menu,
it's important that the source actor gets allocated before we allocate.
Currently the only way to ensure that the source actor is allocated
before the popup menu is by handling the layout via the parent actor, as
the order of the allocations done when queuing shallow relayouts is
currently undefined. As of d94638acae ("clutter/actor: Make child
position changes a noop when possible") in mutter,
Clutter.Actor.set_child_above_sibling() has a fast path when the
position doesn't change, which means the parent was did not get its
relayout queued. This caused the popup menu to end up being allocated
before the source actor, thus using an out of date source actor
allocation to base its position calculation on.
To fix this, queue a relayout on the parent actor unconditionally, after
inserting it into the parent actor, to let us be able to rely on the
source actor having been allocated before the popup menu itself getting
allocated.
Jonas Dreßler [Thu, 24 Jul 2025 16:27:29 +0000 (18:27 +0200)]
st/theme-context: Run dispose on theme nodes on theme context changes
When the theme context changes, we clear the theme cache and make the
widget tree throw away and create new theme nodes. That's because the
old theme nodes can no longer be used, they might be referencing old
CSS data, scale factors, or other things.
St itself should never reuse theme nodes after theme context changes,
but of course theme nodes are exposed to users of St, and they can
always keep a theme node around and call a method on it even after a
theme context change.
To avoid those outdated theme nodes accessing outdated pointers into
the Croco structures and causing crashes, force-run their `dispose()`
function when the theme context changes. This should ensure that all
problematic pointers in the theme nodes are cleared, and users of St
can't crash gnome-shell.
Jonas Dreßler [Thu, 24 Jul 2025 17:47:58 +0000 (19:47 +0200)]
st/theme-node: Free properties array on dispose rather than finalize
We're going to use `g_object_run_dispose()` on StThemeNode with the next
commit in order to manually clear the properties array and a few other
things when the StThemeContext changes.
That's because after theme context changes, the CSS properties will no
longer be valid, and accessing them will cause crashes. Even if St behaves
nicely and throws out all theme nodes on theme context changes, there
might still be users holding references to nodes, so we want to ensure that
the old nodes are harmless after theme context changes.
Jonas Dreßler [Thu, 24 Jul 2025 16:51:25 +0000 (18:51 +0200)]
st/widget: Don't animate theme node updates on theme context changes
With commit 4dfa39457e, I was assuming that emitting `::changed` on the
StThemeContext, triggering StWidgets recursive style-changed machinery,
is enough to get rid of all the theme nodes that are in use, ensuring
they're never accessed again after the `::changed` emission.
That assumption turned out to be wrong: `st_widget_recompute_style()`
animates updates of theme nodes using StThemeNodeTransition, and
StThemeNodeTransition keeps the old theme node around, accessing it at
various later points. This caused various crashes on extension
loading/unloading, because that triggers a theme context change, where
a StThemeNodeTransition would later access an outdated theme node,
pointing to CSS properties that are already freed.
That said, reverting 4dfa39457e doesn't seem like the best idea,
because other calls to `st_theme_context_changed()` also seem to make
the same (incorrect) assumption, eg. `st_theme_context_set_theme()`
seems like a good candidate for a similar crash.
Probably St just shouldn't try to animate on theme context changes: The
old theme nodes are no longer usable after those, but
StThemeNodeTransition expects them to be, so that's just a bad idea.
So change the style-changed machinery a bit to allow disabling transitions
and use that to avoid transitions on theme context changes.
Fixes: 4dfa39457e ("st/theme-context: Also remove theme nodes on stylesheet changes") Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7339
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3809>
status/network: Update Wi-Fi quicksettings icon on disconnect
Prior to this patch, upon a connected AP disconnecting from
the device, the current quicksettings wi-fi icon will continue
showing the "network-wireless-connected-symbolic" symbol in
the time between the initial disconnection and the adapter
deactivation, even though the connection has been
degraded by virtue of no longer being routable.
This will also happen in the
NM.ActiveConnectionState.DEACTIVATING state.
To make this clearer to the user, this change modifies
quicksettings' wifi icon to reflect the degraded states:
- An activated adapter with no active AP connection will
now map to the network-wireless-offline-symbolic icon
(to indicate that the AP signal is lost)
- NM.ActiveConnectionState.DEACTIVATING will now map to the
network-wireless-acquiring-symbolic icon (to indicate that
a state transition is in progress)
gdm/authPrompt: Preserve the text when switching entry visibility
The text visibility of an auth prompt entry may change dynamically at
runtime, in particular when unlocking the screen with the blank screen
or with the screen shield visible this is happening:
- The user starts typing the PAM credential (may be secret or not)
- Under the hood the PAM conversation starts and actually asks user
for input
- The entry text is not cleared because we use what the user has typed
so far as the preemptive secret.
- The entry is adjusted to follow the requested PAM text visibility
settings.
-> This may lead to switching the actual text entry widget in use
Now, if the first entry that PAM requires is "ECHO ON", like it may
happen in the case in which a visible value is requested, we end up
"clearing" what the user as typed instead of preserving the value as
pre-filled value.
Causing the user typing something wrong instead.
To prevent this we need to restore both the text, the cursor position
and the selection bounds (in case the use pressed some key [binding])
leading to a position or selection change.
In multi-factor authentication cases we may end up clearing the current
entry, but we are potentially leaving a previously filled inactive entry
as it is.
Avoid this, and clear all the entries we have when clearing the prompt.
gdm/authPrompt: Unset the entry reference on destruction
We use the internal entry as the reference to the text entry that is
currently in use, but during destruction we do not unset it, thus the
garbage collector may requires further cycles to actually release it.
Carlos Garnacho [Mon, 18 Aug 2025 16:59:49 +0000 (18:59 +0200)]
slider: Flip horizontal scroll coordinates in RTL languages
In those languages, the horizontal axis still grows positively
towards the right, which means we need to invert left and right
as they come from scroll events, in order to have the expected
effect.
Carlos Garnacho [Mon, 18 Aug 2025 16:55:32 +0000 (18:55 +0200)]
status/volume: Handle scroll events distinctly
Stop funneling the events to the (maybe hidden) volume
slider actor, and handle events directly at the volume
status icon.
This allows us to move it back to vertical motion, since
there are no cues to make us think scroll should be
horizontal here. The slider will still prefer horizontal
motion.
"Preserve battery health" is a new feature which limits battery
charging in order to increase battery longevity.
Currently when the charging limit is hit, the state is
indistinguishable from the unplugged, discharging state,
which isn't great: The user has no way to know whether
the limit was reached, or they accidentally unplugged
the device.
To address this, use dedicated icons in the plugged-in-
but-not-charging case.
Sebastian Keller [Thu, 21 Aug 2025 17:45:21 +0000 (19:45 +0200)]
st/private: Fix texture leak when creating shadow from actor
cogl_pipeline_set_layer_texture() adds its own ref to the texture in
_cogl_pipeline_set_layer_texture_data() when called via
_st_create_shadow_pipeline(), so the initial reference is leaked when
the pointer is stolen.
Fix this by not stealing the pointer, so autoptr can unref the texture.
Before the code was changed to autoptr in 71accdd97 the texture was also
manually unrefed after calling _st_create_shadow_pipeline().
Carlos Garnacho [Fri, 23 May 2025 09:12:20 +0000 (11:12 +0200)]
gdm: Drop explicit calls to sync_hover()
This was added in commit bfea41b771, together with some
manual hover/reactive state manipulation. The rest of the
calls went away, and crossing events came a long way since,
these explicit sync_hover() calls are not necessary anymore.
Jonas Dreßler [Fri, 1 Mar 2024 17:39:18 +0000 (18:39 +0100)]
st/focus-manager: Check for NULL instead of stage to exit loop
In st_focus_manager_stage_event() we get the current key-focus actor from
the stage, and then enter a loop where we iterate through parents until we
get to the stage. If the key-focus actor is not a descendent of the stage
for some reason, this loop will never exit and we've locked up.
We can easily prevent the endless loop by checking for NULL as the exit
condition instead of checking for the stage, so do that instead.